1806E - Tree Master - CodeForces Solution


brute force data structures dfs and similar hashing sortings trees

Please click on ads to support us..

C++ Code:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int T;
unordered_map<int,int>p[100005];
vector<int>ep[100005];
int dep[100005];
int n,q;
int a[100005];
int fa[100005];
int s[100005];
void dfs(int k,int sum){
	dep[k]=dep[fa[k]]+1;
	sum+=a[k]*a[k];
	s[k]=sum;
	for(int i=0;i<ep[k].size();i++){
		dfs(ep[k][i],sum);
	}
}
int f(int x,int y){
	if(x>y)swap(x,y);
	if(x==y)return s[x];
	if(dep[x]%3==0){
	
	int op=p[x][y]; 
	if(op)return op;
	return p[x][y]=f(fa[x],fa[y])+a[x]*a[y];
	}
	return f(fa[x],fa[y])+a[x]*a[y];
}
void solve(){
scanf("%lld %lld",&n,&q);
for(int i=1;i<=n;i++){
	scanf("%lld",&a[i]);
}
int t1,t2;
for(int i=2;i<=n;i++){
	scanf("%lld",&fa[i]);
	ep[fa[i]].push_back(i);
}
dfs(1,0);
for(int i=1;i<=q;i++){
	scanf("%lld %lld",&t1,&t2);
	printf("%lld\n",f(t1,t2));
}
}
signed main(){
T=1;
//ios::sync_with_stdio(0);
//cin.tie(0);
//cin>>T;
while(T--){
solve();
 
}
 
 
 
 
return 0;
}


Comments

Submit
0 Comments
More Questions

1051. Height Checker
695. Max Area of Island
402. Remove K Digits
97. Interleaving String
543. Diameter of Binary Tree
124. Binary Tree Maximum Path Sum
1465. Maximum Area of a Piece of Cake After Horizontal and Vertical Cuts
501A - Contest
160A- Twins
752. Open the Lock
1535A - Fair Playoff
1538F - Interesting Function
1920. Build Array from Permutation
494. Target Sum
797. All Paths From Source to Target
1547B - Alphabetical Strings
1550A - Find The Array
118B - Present from Lena
27A - Next Test
785. Is Graph Bipartite
90. Subsets II
1560A - Dislike of Threes
36. Valid Sudoku
557. Reverse Words in a String III
566. Reshape the Matrix
167. Two Sum II - Input array is sorted
387. First Unique Character in a String
383. Ransom Note
242. Valid Anagram
141. Linked List Cycle